package net.servir.capacidades.web.controller;

import java.util.LinkedList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.ExmCalifica;
import net.servir.capacidades.model.ExmConfig;
import net.servir.capacidades.model.ExmPerfil;
import net.servir.capacidades.model.FuncionLeyenda;
import net.servir.capacidades.model.GrupoCalificacion;
import net.servir.capacidades.model.NivelGobierno;
import net.servir.capacidades.model.PreguntaServicio;
import net.servir.capacidades.model.PreguntaTipo;
import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.PuestoTipo;
import net.servir.capacidades.model.SectorPregunta;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.Enumerados.GrupoDatosMaestro;
import net.servir.capacidades.model.jsp.JspPerfilExamenEdicion;
import net.servir.capacidades.service.AlgoritmoService;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.MantenimientoService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class PerfilExamenEdicionController {

	@Autowired 
	private CapacidadesService capacidadesService;
	@Autowired 
	private MantenimientoService mantenimientoService;
	
	@Autowired 
	private AlgoritmoService algoritmoService;
	
	
	@RequestMapping("/perfilExamenEdicion.htm")
	public @ModelAttribute("perfil")
	JspPerfilExamenEdicion editar(HttpServletRequest request,HttpServletResponse response) throws Exception {
		
		JspPerfilExamenEdicion obj = new JspPerfilExamenEdicion();
		
		//************************************************************
		// se obtiene el dni de la session activa
		//************************************************************
		
		HttpSession session = request.getSession();
		String cod_session =session.getId();

		String dniResponsable = null;
		if(session.getAttribute("dni") != null)			
			dniResponsable = session.getAttribute("dni").toString();
		
		//Obtenemos los datos del Usuario
		Usuario usuario = null;
		if(session.getAttribute("usuario") != null)			
			usuario = (Usuario)session.getAttribute("usuario");
		
		
		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");
		
		obj.setUsuario(usuario);				
		//************************************************************

		ExmPerfil exmPerfil = new ExmPerfil();
		List<ExmConfig> lstExmConfig = new LinkedList<ExmConfig>();
		List<ExmCalifica> lstExmCalifica = new LinkedList<ExmCalifica>();
		
		exmPerfil.setCerrado("0");
		Number idSistema = null;
		Number idExmPerfil = null;
		Number idNivelGobierno = null;
		Number idPuestoTipo = null;
		String accion = null;
		if (request.getParameter("id_sistema") != null && !request.getParameter("id_sistema").equals(""))
		{
			idSistema = Integer.parseInt(request.getParameter("id_sistema"));
			exmPerfil.setId_sistema(idSistema);
			obj.setAmbitos(capacidadesService.ObtenerAmbito(idSistema));
		}
		if (request.getParameter("id_grupo_califica") != null && !request.getParameter("id_grupo_califica").equals(""))
		{
			String value_id_grupos = request.getParameter("id_grupo_califica").trim();
			Number id_grupo_califica_edit = Integer.parseInt(value_id_grupos);
			obj.setId_grupo_califica_edit(id_grupo_califica_edit);
		}

		//Obtenemos los listados
		List<NivelGobierno> lstNivelGobierno = capacidadesService.ObtenerNivelGobiernos();
		List<PuestoTipo> lstPuestoTipo = mantenimientoService.getPuestoTipos(idSistema);
		List<FuncionLeyenda> lstFuncionLeyenda = mantenimientoService.getFuncionesPorSistema(idSistema,GrupoDatosMaestro.PARA_ALGORITMO);		
		List<SectorPregunta> lstSectorPregunta = mantenimientoService.getSectoresPregunta(GrupoDatosMaestro.PARA_ALGORITMO);
		List<PreguntaServicio> lstPreguntaServicio = mantenimientoService.getPreguntasServicio(idSistema);
		List<GrupoCalificacion> lstGrupoCalificacion = mantenimientoService.getGruposCalificacionPorSistema(idSistema);
		List<GrupoCalificacion> lstGrupoCalificacionNemotecnico = mantenimientoService.getGruposCalificacionNemotecnicoPorSistema(idSistema);
		List<PreguntaTipo> lstPreguntaTipo = mantenimientoService.getPreguntaTipos(idSistema);
		String mensajeUsuario = "";

		if (request.getParameter("id_exm_perfil") != null && !request.getParameter("id_exm_perfil").equals(""))
			idExmPerfil = Integer.parseInt(request.getParameter("id_exm_perfil"));

		if (request.getParameter("id_nivel_gobierno_sel") != null && !request.getParameter("id_nivel_gobierno_sel").equals(""))
			idNivelGobierno = Integer.parseInt(request.getParameter("id_nivel_gobierno_sel"));
		if (request.getParameter("id_puesto_tipo_sel") != null && !request.getParameter("id_puesto_tipo_sel").equals(""))
			idPuestoTipo = Integer.parseInt(request.getParameter("id_puesto_tipo_sel"));

		obj.setId_nivel_gobierno_sel(idNivelGobierno);
		obj.setId_puesto_tipo_sel(idPuestoTipo);
		
		if (idExmPerfil != null)
		{
			exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);
			if (!exmPerfil.getCerrado().equals("0"))
				mensajeUsuario = "EL algoritmo no puede ser editado debido a que fue empleado en una prueba de diagnóstico ya cerrada.";
			
			if(idNivelGobierno == null && lstNivelGobierno.size()> 0)
				idNivelGobierno = lstNivelGobierno.get(0).getId_nivel_gobierno();
			if(idPuestoTipo == null && lstPuestoTipo.size()> 0)
				idPuestoTipo = lstPuestoTipo.get(0).getId_puesto_tipo();
			
			lstExmConfig = algoritmoService.getConfigPreguntasPerfil(idExmPerfil,idNivelGobierno,idPuestoTipo);
			lstExmCalifica = algoritmoService.getConfigCalificaPerfil(idExmPerfil,idPuestoTipo);
		}
		
		//Recuperamos los valores del editor
		String descripcion = request.getParameter("exm_perfil");
		Number nroPreguntas = null;
		if (request.getParameter("nro_preguntas") != null && !request.getParameter("nro_preguntas").equals(""))
			nroPreguntas = Integer.parseInt(request.getParameter("nro_preguntas"));

		Number maxNroFunciones = null;
		if (request.getParameter("max_nro_funciones") != null && !request.getParameter("max_nro_funciones").equals(""))
			maxNroFunciones = Integer.parseInt(request.getParameter("max_nro_funciones"));
		
		
		List<ExmConfig> lstExmConfigEdit = algoritmoService.getConfigPreguntasPerfil(idExmPerfil,idNivelGobierno,idPuestoTipo);
		/*for (ExmConfig exmConfig : lstExmConfigEdit) {
			Number orden = null;
			Number porcentajePreg = null;
			Number idFuncion = null;
			Number idPreguntaServicio = null;
			Number idSectorPregunta = null;
			
			String tmp = "";
			tmp = "orden_"+exmConfig.getId_pregunta_tipo();
			if (request.getParameter(tmp) != null && !request.getParameter(tmp).equals(""))
				orden = Integer.parseInt(request.getParameter(tmp));

			tmp = "porcentaje_preg_"+exmConfig.getId_pregunta_tipo();
			if (request.getParameter(tmp) != null && !request.getParameter(tmp).equals(""))
				porcentajePreg = Integer.parseInt(request.getParameter(tmp));
			
			tmp = "id_funcion_"+exmConfig.getId_pregunta_tipo();
			if (request.getParameter(tmp) != null && !request.getParameter(tmp).equals(""))
				idFuncion = Integer.parseInt(request.getParameter(tmp));

			tmp = "id_pregunta_servicio_"+exmConfig.getId_pregunta_tipo();
			if (request.getParameter(tmp) != null && !request.getParameter(tmp).equals(""))
				idPreguntaServicio = Integer.parseInt(request.getParameter(tmp));

			tmp = "id_sector_pregunta_"+exmConfig.getId_pregunta_tipo();
			if (request.getParameter(tmp) != null && !request.getParameter(tmp).equals(""))
				idSectorPregunta = Integer.parseInt(request.getParameter(tmp));

			exmConfig.setOrden(orden);
			exmConfig.setPorcentaje_preg(porcentajePreg);
			exmConfig.setId_funcion(idFuncion);
			exmConfig.setId_pregunta_servicio(idPreguntaServicio);
			exmConfig.setId_sector_pregunta(idSectorPregunta);
			
			exmConfig.setId_nivel_gobierno(idNivelGobierno);
			exmConfig.setId_puesto_tipo(idPuestoTipo);
		}*/

		//Seteamos el objeto a retornar
		
		obj.setExmPerfil(exmPerfil);
		obj.setLstNivelGobierno(lstNivelGobierno);
		obj.setLstPuestoTipo(lstPuestoTipo);
		obj.setLstExmConfig(lstExmConfig);
		obj.setLstExmCalifica(lstExmCalifica);
		obj.setLstFuncionLeyenda(lstFuncionLeyenda);
		obj.setLstSectorPregunta(lstSectorPregunta);
		obj.setLstGrupoCalificacion(lstGrupoCalificacion);
		obj.setLstGrupoCalificacionNemotecnico(lstGrupoCalificacionNemotecnico);
		obj.setLstPreguntaServicio(lstPreguntaServicio);
		obj.setLstPreguntaTipo(lstPreguntaTipo);

		//String codEstadoParticipante = null;
		// obtener valores del accion de usuario
		accion = request.getParameter("accion");
		String tipoEdicion = request.getParameter("tipo_edicion");
		if (tipoEdicion == null || tipoEdicion.equals(""))
		{
			if (idSistema == null)
				tipoEdicion = "NUEVO";
			else
				tipoEdicion = "MODIFICAR";
		}	
		
		obj.setTipo_edicion(tipoEdicion);
		
		String redirect = "";

		// set valores de los controles
		if(accion != null && !accion.equals(""))
		{
			/*if(accion.equals("GRABAR_AMBITO"))
			{
				Ambito ambito = new Ambito();
				if (request.getParameter("id_ambito")!= null && !request.getParameter("id_ambito").equals(""))
					idAmbito = Integer.parseInt(request.getParameter("id_ambito"));
				
				ambito.setId_ambito(idAmbito);
				ambito.setDescripcion(request.getParameter("ambito_descripcion"));
				ambito.setEstado("1");
				ambito.setId_sistema(idSistema);
				
				idAmbito = algoritmoService.grabarAmbito(ambito);	
				exmPerfil = algoritmoService.getSistema(idSistema);
				obj.setSistema(exmPerfil);
			}			
			else if(accion.equals("ELIMINAR_AMBITO"))
			{
				if (request.getParameter("id_ambito")!= null && !request.getParameter("id_ambito").equals(""))
				{
					idAmbito = Integer.parseInt(request.getParameter("id_ambito"));
					mensajeUsuario =  algoritmoService.validarEliminarAmbito(idAmbito);
					if (mensajeUsuario.equals(""))
					{
						algoritmoService.eliminarAmbito(idAmbito);
					}
				}
				exmPerfil = algoritmoService.getSistema(idSistema);
				obj.setSistema(exmPerfil);
			}*/			
			
			exmPerfil.setExm_perfil(descripcion);
			exmPerfil.setNro_preguntas(nroPreguntas);
			exmPerfil.setMax_nro_funciones(maxNroFunciones);
			
						
			if(accion.equals("GRABAR"))
			{
				obj.setLstExmConfig(lstExmConfigEdit);
				
				idExmPerfil = algoritmoService.grabarExmPerfil(obj);	
				exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);				
				obj.setExmPerfil(exmPerfil);				
				mensajeUsuario = "Datos grabados correctamente";
				obj.setTipo_edicion("MODIFICAR");
				//redirect = "perfilesExamen.htm?id_sistema="+idSistema;
			}
			else if(accion.equals("GRABAR_CALIFICACION"))
			{	
				obj.setLstExmConfig(lstExmConfigEdit);
				
				ExmCalifica exmCalifica = new ExmCalifica();				
				
				Number idFuncionAdd = null;
				if (request.getParameter("id_funcion_add") != null && !request.getParameter("id_funcion_add").equals(""))
					idFuncionAdd = Integer.parseInt(request.getParameter("id_funcion_add"));
				Number idPreguntaTipoAdd = null;
				if (request.getParameter("id_pregunta_tipo_add") != null && !request.getParameter("id_pregunta_tipo_add").equals(""))
					idPreguntaTipoAdd = Integer.parseInt(request.getParameter("id_pregunta_tipo_add"));
				Number idGrupoCalificaAdd = null;
				if (request.getParameter("id_grupo_califica_add") != null && !request.getParameter("id_grupo_califica_add").equals(""))
					idGrupoCalificaAdd = Integer.parseInt(request.getParameter("id_grupo_califica_add"));
				Number porcentajeAprobAdd = null;
				if (request.getParameter("porcentaje_aprob_add") != null && !request.getParameter("porcentaje_aprob_add").equals(""))
					porcentajeAprobAdd = Float.parseFloat(request.getParameter("porcentaje_aprob_add"));

				
				
				exmCalifica.setId_exm_perfil(idExmPerfil);
				exmCalifica.setId_puesto_tipo(idPuestoTipo);
				
				exmCalifica.setId_funcion(idFuncionAdd);
				exmCalifica.setId_grupo_califica(idGrupoCalificaAdd);
				exmCalifica.setId_pregunta_tipo(idPreguntaTipoAdd);				
				exmCalifica.setPorcentaje_aprob(porcentajeAprobAdd);
				
				Number idExmCalificacion = algoritmoService.grabarExmCalificacion(exmCalifica);
				
				//Recuperamos la data
				exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);				
				lstExmCalifica = algoritmoService.getConfigCalificaPerfil(idExmPerfil,idPuestoTipo);
				
				obj.setExmPerfil(exmPerfil);
				obj.setLstExmCalifica(lstExmCalifica);
				
				//redirect = "perfilesExamen.htm?id_sistema="+idSistema;
			}
			else if(accion.equals("GRABAR_CONFIGURACION"))
			{	
				//obj.setLstExmConfig(lstExmConfigEdit);
				
				ExmConfig exmConfig = new ExmConfig();				

				Number idPreguntaTipoCfg = null;
				if (request.getParameter("id_pregunta_tipo_cfg") != null && !request.getParameter("id_pregunta_tipo_cfg").equals(""))
					idPreguntaTipoCfg = Integer.parseInt(request.getParameter("id_pregunta_tipo_cfg"));

				Number ordenCfg = null;
				if (request.getParameter("orden_cfg") != null && !request.getParameter("orden_cfg").equals(""))
					ordenCfg = Integer.parseInt(request.getParameter("orden_cfg"));

				Number porcentajePregCfg = null;
				if (request.getParameter("porcentaje_preg_cfg") != null && !request.getParameter("porcentaje_preg_cfg").equals(""))
					porcentajePregCfg = Float.parseFloat(request.getParameter("porcentaje_preg_cfg"));
				
				Number idFuncionCfg = null;
				if (request.getParameter("id_funcion_cfg") != null && !request.getParameter("id_funcion_cfg").equals(""))
					idFuncionCfg = Integer.parseInt(request.getParameter("id_funcion_cfg"));

				/*Number idPreguntaServicioCfg = null;
				if (request.getParameter("id_pregunta_servicio_cfg") != null && !request.getParameter("id_pregunta_servicio_cfg").equals(""))
					idPreguntaServicioCfg = Integer.parseInt(request.getParameter("id_pregunta_servicio_cfg"));*/

				/*Number idSectorPreguntaCfg = null;
				if (request.getParameter("id_sector_pregunta_cfg") != null && !request.getParameter("id_sector_pregunta_cfg").equals(""))
					idSectorPreguntaCfg = Integer.parseInt(request.getParameter("id_sector_pregunta_cfg"));*/
				

				
				
				exmConfig.setId_exm_perfil(idExmPerfil);
				exmConfig.setId_puesto_tipo(idPuestoTipo);
				exmConfig.setId_nivel_gobierno(idNivelGobierno);
				
				exmConfig.setId_pregunta_tipo(idPreguntaTipoCfg);
				exmConfig.setOrden(ordenCfg);
				exmConfig.setPorcentaje_preg(porcentajePregCfg);
				exmConfig.setId_funcion(idFuncionCfg);
				//exmConfig.setId_pregunta_servicio(idPreguntaServicioCfg);
				//exmConfig.setId_sector_pregunta(idSectorPreguntaCfg);
								
				
				
				Number idExmConfig = algoritmoService.grabarExmConfig(exmConfig);
				
				//Recuperamos la data
				exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);
				lstExmConfigEdit = algoritmoService.getConfigPreguntasPerfil(idExmPerfil,idNivelGobierno,idPuestoTipo);
				
				obj.setExmPerfil(exmPerfil);
				obj.setLstExmConfig(lstExmConfigEdit);					
				
				//redirect = "perfilesExamen.htm?id_sistema="+idSistema;
			}			
			else if(accion.equals("ELIMINAR_CALIFICACION"))
			{				
				obj.setLstExmConfig(lstExmConfigEdit);
				
				ExmCalifica exmCalifica = new ExmCalifica();				
				
				Number idExmCalifica = null;
				if (request.getParameter("id_exm_califica") != null && !request.getParameter("id_exm_califica").equals(""))
				{
					idExmCalifica = Integer.parseInt(request.getParameter("id_exm_califica"));					
					algoritmoService.eliminarExmCalifica(idExmCalifica);
					
					//Recuperamos la data
					exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);				
					lstExmCalifica = algoritmoService.getConfigCalificaPerfil(idExmPerfil,idPuestoTipo);

					obj.setExmPerfil(exmPerfil);
					obj.setLstExmCalifica(lstExmCalifica);					
				}
				//redirect = "perfilesExamen.htm?id_sistema="+idSistema;
			}			
			else if(accion.equals("ELIMINAR_CONFIGURACION"))
			{				
				obj.setLstExmConfig(lstExmConfigEdit);
				
				ExmConfig exmConfig = new ExmConfig();				
				
				Number idExmConfig = null;
				if (request.getParameter("id_exm_config") != null && !request.getParameter("id_exm_config").equals(""))
				{
					idExmConfig = Integer.parseInt(request.getParameter("id_exm_config"));					
					algoritmoService.eliminarExmConfig(idExmConfig);
					
					//Recuperamos la data
					exmPerfil = algoritmoService.getExmPerfil(idExmPerfil);
					lstExmConfigEdit = algoritmoService.getConfigPreguntasPerfil(idExmPerfil,idNivelGobierno,idPuestoTipo);
					
					obj.setExmPerfil(exmPerfil);
					obj.setLstExmConfig(lstExmConfigEdit);					
				}
				//redirect = "perfilesExamen.htm?id_sistema="+idSistema;
			}	
			else if (accion.equals("GRABAR_GRUPO"))
			{				
				String grupo_calificacion  = request.getParameter("grupo_calificacion");
				String nemotecnico  = request.getParameter("nemotecnico");
				Integer id_grupo_califica  = null;
				Integer id_ambito  = null;
				if (!request.getParameter("id_grupo_califica").equals(""))
					id_grupo_califica  = Integer.parseInt(request.getParameter("id_grupo_califica"));
				if (!request.getParameter("idAmbitoGrupoCalifica").equals(""))
					id_ambito  = Integer.parseInt(request.getParameter("idAmbitoGrupoCalifica"));

				GrupoCalificacion grupoCalificacion = new GrupoCalificacion();
				grupoCalificacion.setGrupo_calificacion(grupo_calificacion.trim());
				grupoCalificacion.setNemotecnico(nemotecnico.toUpperCase().trim());
				grupoCalificacion.setId_grupo_califica(id_grupo_califica);
				grupoCalificacion.setId_ambito(id_ambito);
				id_grupo_califica = mantenimientoService.grabarGrupoCalificacion(grupoCalificacion);
				obj.setMensaje_usuario("Datos grabados correctamente.");
				obj.setLstGrupoCalificacion(mantenimientoService.getGruposCalificacionPorSistema(idSistema));
				obj.setLstGrupoCalificacionNemotecnico(mantenimientoService.getGruposCalificacionNemotecnicoPorSistema(idSistema));
			}
			else if (accion.equals("BORRAR_GRUPO"))
			{				
				if (request.getParameter("id_grupo_califica")!= null && !request.getParameter("id_grupo_califica").equals(""))
				{
					Integer id_grupo_califica = Integer.parseInt(request.getParameter("id_grupo_califica"));
					mensajeUsuario =  mantenimientoService.validarEliminarGrupoCalificacion(id_grupo_califica);
					if (mensajeUsuario.equals(""))
					{
						mantenimientoService.eliminarGrupoCalificacion(id_grupo_califica);
						mensajeUsuario = "Grupo de calificación eliminado correctamente";
						obj.setLstGrupoCalificacion(mantenimientoService.getGruposCalificacionPorSistema(idSistema));
						obj.setLstGrupoCalificacionNemotecnico(mantenimientoService.getGruposCalificacionNemotecnicoPorSistema(idSistema));
					}
					obj.setMensaje_usuario(mensajeUsuario);
					
				}
			}
			 
			if (!redirect.equals(""))
				response.sendRedirect(redirect);
				
		}
		//if (exmPerfil != null)
		//	request.setAttribute("DATALIST", exmPerfil.getAmbitos());

		//Verificamos cual es el porcentaje de las preguntas configuradas
		float porcentajeAcumuladoPreg = 0;
		for (ExmConfig exmConfig : lstExmConfigEdit) {
			porcentajeAcumuladoPreg += exmConfig.getPorcentaje_preg().doubleValue(); 
		}
		obj.setPorcentaje_acumulado_preg(porcentajeAcumuladoPreg);
		obj.setMensaje_usuario(mensajeUsuario);
		return obj;
	}	

}
